package com.rao.gmall.common.config;

import com.rao.gmall.common.cache.BloomName;
import com.rao.gmall.common.constant.RedisConst;
import org.redisson.Redisson;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author nzmxfan
 * @create 2021-08-09-20:12
 */
@ConditionalOnProperty(prefix = "redisson", name = "enable", havingValue = "true", matchIfMissing = true)
@Configuration
public class ItemRedissonConfig {

    // @Bean 注解不能忘记，不然无法注入
    @Bean
    public RedissonClient redissonClient(RedisProperties redisProperties){
        // 动态获取客户端属性
        String host = redisProperties.getHost();
        int port = redisProperties.getPort();
        // 组装配置文件
        Config config = new Config();
        config.useSingleServer().setAddress("redis://" + host + ":" + port);
        //创建客户端
        RedissonClient redisson = Redisson.create(config);
        // 返回客户端
        return redisson;
    }

    /**
     *  第一步：通过 @Configuration 在启动类启动时，将初始化之后的名字为 BloomName.SKU 的布隆过滤器进行注入
     * @param redissonClient
     * @return
     */
    @Bean(value = BloomName.SKU)
    public RBloomFilter<Object> skufilter(RedissonClient redissonClient){
        // sku 的布隆过滤器
        RBloomFilter<Object> bloomFilter = redissonClient.getBloomFilter(RedisConst.SKUKEY_PREFIX);
        // 用之前需要进行初始化，系统重启不会被覆盖
        bloomFilter.tryInit(10000L, 0.001);

        return bloomFilter;
    }

    /**
     * 通过 @Configuration 在启动类启动时，将初始化之后的名字为 BloomName.SPU 的布隆过滤器进行注入
     * @param redissonClient
     * @return
     */
    @Bean(value = BloomName.SPU)
    public RBloomFilter<Object> userfilter(RedissonClient redissonClient){
        // spu 的布隆过滤器
        RBloomFilter<Object> bloomFilter = redissonClient.getBloomFilter(RedisConst.USER_KEY_PREFIX);
        // 用之前要初始化
        bloomFilter.tryInit(10000L,0.01);

        return bloomFilter;
    }
}
